AVAsset 读取 / 写入 / 导出 PRO
三个 AVAsset 的低层伴随 API,对应 iOS 的 AVAssetExportSession / AVAssetReader / AVAssetWriter:
AVAssetExportSession—— 高层转码 / 重压缩,按 preset 名启动。AVAssetReader+ 输出类 —— 拉取已解码视频帧(UIImage)或 PCM 音频(Float32Array)。AVAssetWriter+AVAssetWriterInput—— 把 JS 端生成的帧 / 采样推入新的 mp4 / m4a 文件。
仅支持本地文件。
AVAssetReader与AVAssetExportSession在 HTTP 流式 asset 上不可靠。请先用fetch()+FileManager.writeAsBytes()把远程文件下载到本地,再从本地路径构造 asset。
AVAssetExportSession
按 preset 做高层转码 / 重压缩。
Constructor
new AVAssetExportSession(asset: AVAsset, presetName: AVAssetExportPreset)
asset 必须是未 dispose 的 AVAsset,否则抛错。preset 与 asset 的兼容性会延迟到 exportTo() 内部校验。
属性
方法
exportTo(outputPath: string): Promise<void>
成功 resolve;失败时以 session.error.localizedDescription reject(取消亦走此路径)。已有 export 在执行时再调直接 reject。
如果 outputFileType 与 preset 不兼容,Promise 会以"支持类型列表"的可读消息 reject —— 不会抛出无法捕获的 ObjC NSInvalidArgumentException。
cancel(): void
取消进行中的 export。pending 的 exportTo Promise 会以 "Export cancelled." reject。
dispose(): void
释放底层 session。
AVAssetReader
逐帧 / 逐块拉取 asset 的已解码采样。
AVAssetReader
AVAssetReaderVideoOutput
copyNextFrame() 仅在干净的 end-of-stream 时返回 null。如果 reader 转入 'failed' 或 'cancelled',Promise 会 reject,避免你拿到"0 帧解码"的静默错误。
AVAssetReaderAudioOutput
固定输出 32-bit float interleaved PCM。传多 track 即混音;options.sampleRate 与 options.channels 用于重采样 / 重声道。
AVAssetWriter
手工 push UIImage 帧或 PCM 块,生成新的 mp4 / m4a。
